
//3128.直角三角形
class Solution {
public:
    long long numberOfRightTriangles(vector<vector<int>>& grid) {
        int m=grid.size(),n=grid[0].size();
        vector<long long> line(m);   //每一行1的个数
        vector<long long> row(n);    //每一列1的个数

        for(int i=0;i<m;i++) 
            for(auto e:grid[i]) line[i]+=(e==1);  //统计每一行上1的个数

        for(int i=0;i<n;i++) 
            for(int j=0;j<m;j++) row[i]+=(grid[j][i]==1); //统计每一列上1的个数

        long long ret=0;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(grid[i][j]==1) ret+=(line[i]-1)*(row[j]-1);  //计算以[i,j]为顶点可以组成多少直角三角形

        return ret;
    }
};